import os
import pandas as pd
from tkinter import filedialog, messagebox
from tkinter import Tk

def merge_sheets_with_same_header():
    """
    合并多个工作簿中具有相同表头的工作表到一个工作表中
    """
    # 创建隐藏的Tkinter窗口用于文件对话框
    root = Tk()
    root.withdraw()
    
    try:
        # 1. 让用户选择包含Excel文件的目录
        folder_path = filedialog.askdirectory(title="选择包含Excel文件的目录")
        if not folder_path:
            return
        
        # 2. 获取目录中所有Excel文件
        excel_files = [f for f in os.listdir(folder_path) 
                      if f.endswith(('.xlsx', '.xls')) and not f.startswith('~$')]
        
        if not excel_files:
            messagebox.showinfo("提示", "所选目录中没有Excel文件")
            return
        
        # 3. 初始化存储数据的列表
        all_data = []
        header = None
        
        # 4. 遍历所有Excel文件
        for file in excel_files:
            file_path = os.path.join(folder_path, file)
            
            # 5. 读取Excel文件中的所有工作表
            xls = pd.ExcelFile(file_path)
            
            for sheet_name in xls.sheet_names:
                # 6. 读取工作表数据
                df = pd.read_excel(xls, sheet_name=sheet_name)
                
                # 7. 检查表头是否一致
                if header is None:
                    header = tuple(df.columns)  # 使用元组作为不可变对象
                    all_data.append(df)
                elif tuple(df.columns) == header:
                    all_data.append(df)
        
        # 8. 合并所有数据
        if not all_data:
            messagebox.showinfo("提示", "没有找到具有相同表头的工作表")
            return
        
        combined_df = pd.concat(all_data, ignore_index=True)
        
        # 9. 让用户选择保存位置
        save_path = filedialog.asksaveasfilename(
            defaultextension=".xlsx",
            filetypes=[("Excel文件", "*.xlsx")],
            title="保存合并后的文件"
        )
        
        if not save_path:
            return
        
        # 10. 保存合并后的数据
        combined_df.to_excel(save_path, index=False)
        messagebox.showinfo("成功", f"合并完成！文件已保存到:\n{save_path}")
    
    except Exception as e:
        messagebox.showerror("错误", f"合并过程中出错: {str(e)}")
    
    finally:
        root.destroy()

if __name__ == "__main__":
    merge_sheets_with_same_header()
